package com.threadexception;

import jdk.management.resource.internal.inst.FileInputStreamRMHooks;

/**
 * @PackageName:com.threadexception
 * @ClassName:Test
 * @Description: 演示设置线程的UncaughtExceptionHandler的回调接口
 * @Author: zhangxiaoyu
 * @date 2021/3/17 13:46
 */
public class Test {
    public static void main(String[] args){
        //设置线程全局的回调接口
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                //t参数接受发生异常的线程，e就是线程中的异常
                System.out.println(t.getName()+"线程产生了异常"+e.getMessage());
            }
        });
        
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"开始运行");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(12/0); //会产生算术异常
            }
        });

        t1.start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                String txt = null;
                System.out.println(txt.length());  //会产生空指针异常
            }
        }).start();

        //在实际开发中，这种设计异常的处理方式是比较常用的，尤其是异常执行的方法
        //如果线程产生了异常，jvm会调用dispatchUncaughtException方法，该方法会调用getUncaughtExceptionHandler().uncaughtException(this, e);
        //如果当前线程设置了UncaughtExceptionHandler回调接口就直接调用他自己的UncaughtExceptionHandler方法
        //如果没有设置则调用当前线程所在线程组的回调接口，如果线程组也没有设置回调接口，则直接把异常的栈信息定向到syystem.err中。

    }
}
